#include "MainWindow.h"
#include <QHBoxLayout>
#include <QLabel>
#include <QMenuBar>
#include <QMenu>
#include <QWidget>
#include <iostream>


MainWindow::MainWindow(QWidget *parent, const QString &filePath)
        : QMainWindow(parent), interpolationEnabled(false), widget(nullptr), progreamFilePath(filePath), machine()
    // 初始化代码

{
    //setupMenuBar();//初始化菜单栏


    setupConnections(); // 设置信号和槽连接

    QWidget *centralWidget = new QWidget(this);  // 创建中央控件
    QHBoxLayout *mainLayout = new QHBoxLayout(centralWidget);  // 使用水平布局

// 左侧布局
    QVBoxLayout *leftLayout = new QVBoxLayout();  // 创建垂直布局

// 控件一：显示刀具轨迹
    cadView = new CADView(this);  // 创建CAD界面实例
    toolMover = new ToolMover(cadView); // 创建刀具实例加入场景

    leftLayout->addWidget(cadView);  // 将CAD界面添加到左侧布局

// 控件二：消息框
    messageBox = new QTextEdit(this);
    messageBox->setReadOnly(true); // 只读
    messageBox->setMaximumHeight(150); // 设置最大高度，显示六行
    leftLayout->addWidget(messageBox); // 将消息框添加到左侧布局






// 将左侧布局添加到主布局

    mainLayout->addLayout(leftLayout);

// 绘制一条直线
//    QPointF start(0, 0);
//    QPointF end(200, 200);
//    cadView->drawLine(start, end);


// 绘制一个圆

//    cadView->drawCircle(start,10);
// 在主程序中初始化并使用 ToolMover
//    ToolMover *toolMover2=new ToolMover(cadView);
//    ToolMover *toolMover3=new ToolMover(cadView);
//    ToolMover *toolMover4=new ToolMover(cadView);
//    ToolMover *toolMover5=new ToolMover(cadView);
//    toolMover2->moveTool_line(QPointF(0, 0), QPointF(0, 400), 50, 20,false,true,true);
//    toolMover3->moveTool_line(QPointF(0, 0), QPointF(400, 400), 50, 20,false,true,true);
//    toolMover4->moveTool_line(QPointF(0, 0), QPointF(-400, -400), 50, 20,false,true,true);
//    toolMover5->moveTool_line(QPointF(0, 0), QPointF(400, -400), 50, 20,false,true,true);

// 使用 moveTool_line 移动刀具

//    toolMover->moveTool_line(QPointF(100, 0), QPointF(0, 400), 50, 20,true,true,true);
//   toolMover->moveTool_line(QPointF(100, 100), QPointF(0, -400), 50, 20,true,true,true);

//   toolMover->moveTool_line(QPointF(0, 0), QPointF(-400, 0), 50, 20,false,true,true);
//toolMover->moveTool_line(QPointF(400, 0), QPointF(0, 300), 50, 20,false,true,true);

//////使用moveTool_aRC移动刀具
//    toolMover->LeftEdgePathColor=QColor(Qt::yellow);
//    toolMover->RightEdgePathColor=QColor(Qt::yellow);
//   toolMover->moveTool_arc(QPointF(0, 200), QPointF(200, 0), QPointF(0, 0), 50, 10, true, true,true);



    // 右侧布局，用于其他控件
    QVBoxLayout *rightLayout = new QVBoxLayout;
    rightLayout->setSpacing(20);  // 设置控件之间的间距为2个像素
    rightLayout->setContentsMargins(4, 0, 0, 10);  // 设置布局的边距为2个像素
    // 对齐方式设置为分散对齐
    rightLayout->setAlignment(Qt::AlignJustify);


    QVBoxLayout *rightTopLayout = new QVBoxLayout;
    rightTopLayout->setSpacing(20);  // 设置控件之间的间距为2个像素
    rightTopLayout->setContentsMargins(0, 20, 0, 10);  // 设置布局的边距为2个像素


    QVBoxLayout *rightTopButtonLayout = new QVBoxLayout;
    rightTopButtonLayout->setSpacing(30);  // 设置控件之间的间距为2个像素
    rightTopButtonLayout->setContentsMargins(4, 20, 20, 10);  // 设置布局的边距为2个像素

    // 控件二：文件读取模块
    openWidgetButton = new QPushButton("添加程序文件", this);  // 创建按钮
    openWidgetButton->setMinimumHeight(25);  // 设置最小高度
    connect(openWidgetButton, &QPushButton::clicked, this, &MainWindow::showReadFileDialog); // 连接按钮点击信号到槽函数
    rightTopButtonLayout->addWidget(openWidgetButton); // 将按钮添加到右侧布局

    // 控件3：折叠列表显示文件
    openFileListButton = new QPushButton("查看程序列表", this);  // 创建按钮
    openFileListButton->setMinimumHeight(25);  // 设置最小高度
    connect(openFileListButton, &QPushButton::clicked, this, &MainWindow::showFileListDialog); // 连接按钮点击信号到槽函数
    rightTopButtonLayout->addWidget(openFileListButton); // 将按钮添加到右侧布局

    // 控件4：打开刀具参数输入对话框
    QPushButton *openToolParameterButton = new QPushButton("添加刀具参数", this);
    openToolParameterButton->setMinimumHeight(25);  // 设置最小高度
    connect(openToolParameterButton, &QPushButton::clicked, this, &MainWindow::showToolParameterDialog);  // 连接按钮点击信号到槽函数
    rightTopButtonLayout->addWidget(openToolParameterButton); // 将按钮添加到右侧布局

    rightTopLayout->addLayout(rightTopButtonLayout);

    // 速度显示模块
    QVBoxLayout *rightTopTextLayout = new QVBoxLayout;
    rightTopTextLayout->setSpacing(30);  // 设置控件之间的间距为30个像素
    rightTopTextLayout->setContentsMargins(4, 20, 20, 10);  // 设置布局的边距

    speed0Label = new QLabel("0RPM", this); // 默认主轴速度为0
    speed0Label->setAlignment(Qt::AlignCenter); // 标签文本居中
    speed0Label->setStyleSheet("font-size: 14px; font-weight: bold;"); // 设置字体样式
    rightTopTextLayout->addWidget(speed0Label);  // 将主轴速度标签添加到布局中

    speed1Label = new QLabel("F:0", this); // 默认进给速度为0
    speed1Label->setAlignment(Qt::AlignCenter); // 标签文本居中
    speed1Label->setStyleSheet("font-size: 14px; font-weight: bold;"); // 设置字体样式
    rightTopTextLayout->addWidget(speed1Label);  // 将X轴速度标签添加到布局中


    speed2Label = new QLabel("X:0", this); // 默认X轴坐标
    speed2Label->setAlignment(Qt::AlignCenter); // 标签文本居中
    speed2Label->setStyleSheet("font-size: 14px; font-weight: bold;"); // 设置字体样式
    rightTopTextLayout->addWidget(speed2Label);  // 将X轴速度标签添加到布局中

    speed3Label = new QLabel("Y:0", this); // 默认Y轴坐标
    speed3Label->setAlignment(Qt::AlignCenter); // 标签文本居中
    speed3Label->setStyleSheet("font-size: 14px; font-weight: bold;"); // 设置字体样式
    rightTopTextLayout->addWidget(speed3Label);  // 将Y轴速度标签添加到布局中

    speed4Label = new QLabel("Z:0", this); // 默认Z轴坐标
    speed4Label->setAlignment(Qt::AlignCenter); // 标签文本居中
    speed4Label->setStyleSheet("font-size: 14px; font-weight: bold;"); // 设置字体样式
    rightTopTextLayout->addWidget(speed4Label);  // 将Z轴速度标签添加到布局中


    rightTopLayout->addLayout(rightTopTextLayout);
    rightLayout->addLayout(rightTopLayout);

    QVBoxLayout *rightBottomLayout = new QVBoxLayout();  // 创建垂直布局
    interpolationButton = new QPushButton("Start", this);
    interpolationButton->setMinimumHeight(50);  // 设置最小高度
    interpolationButton->setMinimumWidth(50);   // 设置最小宽度，确保是方形
    connect(interpolationButton, &QPushButton::clicked, this, &MainWindow::toggleInterpolation);

    rightBottomLayout->addWidget(interpolationButton); // 将按钮添加到右侧布局
    // 对齐方式设置为底部
    rightBottomLayout->setAlignment(Qt::AlignBottom);

    rightLayout->addLayout(rightBottomLayout);



    // 将右侧布局添加到主布局
    mainLayout->addLayout(rightLayout);  // 将右侧布局添加到主布局中

    setCentralWidget(centralWidget);
    setWindowTitle("CNC System Simulation");
    // 设置窗口图标
    //setWindowIcon(QIcon(":/resources/my_icon.png")); //
    resize(800, 600);  // 设置窗口大小
}

MainWindow::~MainWindow() {
    for (auto mover : toolMovers) {
        delete mover; // 释放内存
    }

}

void MainWindow::toggleInterpolation() {
    interpolationEnabled = !interpolationEnabled;
    std::string filePath = QDir::currentPath().toStdString() + "/program/" + progreamFilePath.toStdString();
    cout << "File path: " << filePath << endl;  // 打印路径以便调试

    ifstream inputFile(filePath, ios::in | ios::binary);
    if (!inputFile.is_open()) {
        cout << "无法打开G代码文件: " << filePath << endl;  // 提供具体路径信息
        addMessage("请选择G代码文件");
        return;
    }

    gCodeStream = new ifstream(filePath, ios::in | ios::binary); // 使用正确的文件路径
    parseNextLine(); // 开始读取第一行

    interpolationButton->setText(interpolationEnabled ? "Stop" : "Start");
}

void MainWindow::parseNextLine() {
    cout << "next line" << endl;
    if (gCodeStream && !gCodeStream->eof()) {
        string gCode;
        if (getline(*gCodeStream, gCode)) {
            cout << "okok" << endl;
            NCCommand command(gCode); // 解析每一行的代码
            machine.handleCommand(command); // 让状态机去处理
        } else {
            // 读取失败，可能是文件结束或其他错误
            cout << "读取失败，可能已到达文件末尾" << endl;
        }
    } else {
        // 读取完毕，关闭文件流
        if (gCodeStream) {
            gCodeStream->close();
            delete gCodeStream;
            gCodeStream = nullptr;
        }
    }
}



void MainWindow::setupConnections()
{

    connect(this, &MainWindow::nextLineRequested, this, &MainWindow::parseNextLine);
}




void MainWindow::showReadFileDialog() {
    if (!widget) {  // 检查 widget 是否为空（避免多次创建）
        widget = new ReadFileDialog(this);  // 创建新的 ReadFileDialog
    }

    widget->exec();  // 执行对话框
}

void MainWindow::showToolParameterDialog()
{
    ToolParameterDialog toolParameterDialog(this);  // 创建刀具参数对话框
    toolParameterDialog.exec();  // 执行对话框
}

void MainWindow::showFileListDialog()
{

    FileListDialog *fileDialog = new FileListDialog(this);
    connect(fileDialog, &FileListDialog::fileSelected, this, &MainWindow::handleFileSelected);
    fileDialog->exec();  // 显示对话框


}


// 清理消息的函数
void MainWindow::addMessage(const QString &message)
{
    messageBox->append(message ); // 添加文本内容并换行
}

void MainWindow::clearMessages()
{
    messageBox->clear(); // 清空消息框
}
//void MainWindow::updateSpeed(int speed) {
//    speedLabel->setText(QString("速度: %1").arg(speed)); // 更新标签文本
//}
void MainWindow::handleFileSelected(const QString &filePath) {
    // 处理选中的文件路径
    progreamFilePath=filePath;
    std::cout << "选中的文件路径：" <<filePath.toStdString()<<std::endl ;

}
// 更新主轴速度
void MainWindow::updateSpindleSpeed(double speed) {
    speed0Label->setText(QString::number(speed) + " RPM");
}

// 更新进给速度
void MainWindow::updateFeedRate(double feedRate) {
    speed1Label->setText("F:" + QString::number(feedRate));
}

// 更新X轴
void MainWindow::updateXPosition(double x) {
    speed2Label->setText("X:" + QString::number(x));
}

// 更新Y轴
void MainWindow::updateYPosition(double y) {
    speed3Label->setText("Y:" + QString::number(y));
}

// 更新Z轴
void MainWindow::updateZPosition(double z) {
    speed4Label->setText("Z:" + QString::number(z));
}
void MainWindow::EXTS()
{
    parseNextLine(); // 开始读取第一行
}

void MainWindow::deleteLastToolMover() {
    if (!toolMovers.empty()) {
        toolMovers.back()->deleteTool(); // 删除最后一个刀具
        delete toolMovers.back(); // 删除对象
        toolMovers.pop_back(); // 从容器中移除指针
    }
}

double MainWindow::convertSpeed(double speed) const {
    return speed / 60; // 转为每秒
}

void MainWindow::moveToolLine(const QPointF &startPoint, const QPointF &endPoint, double speed, double toolDiameter) {
    speed = convertSpeed(speed); // 使用统一的速度转换函数
    deleteLastToolMover(); // 删除上一个刀具

    // 创建新的ToolMover对象并存储
    ToolMover* newToolMover = new ToolMover(cadView);
    toolMovers.push_back(newToolMover);

    newToolMover->moveTool_line(startPoint, endPoint, speed, toolDiameter / 2, centerPath, leftEdgePath, rightEdgePath);
}

void MainWindow::moveToolArc(const QPointF &startPoint, const QPointF &endPoint, const QPointF &CenterPoint, double speed, double toolDiameter) {

    speed = convertSpeed(speed); // 使用统一的速度转换函数
    deleteLastToolMover(); // 删除上一个刀具

    // 创建新的ToolMover对象并存储
    ToolMover* newToolMover = new ToolMover(cadView);
    toolMovers.push_back(newToolMover);

    newToolMover->moveTool_arc(startPoint, endPoint, CenterPoint, speed, toolDiameter / 2, centerPath, leftEdgePath, rightEdgePath);
}
//void MainWindow::setupMenuBar() {
//    QMenuBar *menuBar = new QMenuBar(this); // 创建菜单栏
//    setMenuBar(menuBar); // 将菜单栏设置到主窗口
//
//    // 创建菜单
//    QMenu *fileMenu = menuBar->addMenu("File"); // 添加文件菜单
//    QMenu *editMenu = menuBar->addMenu("Edit"); // 添加编辑菜单
//    QMenu *helpMenu = menuBar->addMenu("Help"); // 添加帮助菜单
//
//    // 添加菜单项
//    QAction *newAction = new QAction("New", this);
//    connect(newAction, &QAction::triggered, this, &MainWindow::showReadFileDialog);
//    QAction *openAction = new QAction("Open", this);
//    connect(openAction, &QAction::triggered, this, &MainWindow::showFileListDialog);
//    QAction *exitAction = new QAction("Exit", this);
//    connect(exitAction, &QAction::triggered, this, &QWidget::close); // 退出应用
//    // 将菜单项添加到文件菜单
//    fileMenu->addAction(newAction);
//    fileMenu->addAction(openAction);
//    fileMenu->addSeparator(); // 添加分隔线
//    fileMenu->addAction(exitAction);
//
//    //编辑栏
//    QAction *Tool = new QAction("Tool", this);
//    connect(Tool, &QAction::triggered, this, &MainWindow::showToolParameterDialog);
//    editMenu->addAction(Tool);
//
//    // 添加其他菜单项到编辑和帮助菜单（示例）
//    QAction *aboutAction = new QAction("About", this);
//    connect(aboutAction, &QAction::triggered, this, &MainWindow::openManual);
//    QAction *Help = new QAction("Help", this);
//    helpMenu->addAction(aboutAction);
//    helpMenu->addAction(Help);
//
//}
